package com.sbd.config;

import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * 安全配置类，继承自WebSecurityConfigurerAdapter，用于配置Spring Security。
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    /**
     * 使用BCryptPasswordEncoder作为密码编码器。
     * @return 返回BCryptPasswordEncoder实例。
     */
    @Bean // 密码编码器
    public PasswordEncoder passwordEncoder() {return passwordEncoder;}

    /**
     * 配置认证管理器，用于设置内存中的用户认证信息。
     * @param auth AuthenticationManagerBuilder的实例，用于配置认证信息。
     * @throws Exception 如果配置出错，抛出异常。
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 使用内存存储
        auth.inMemoryAuthentication()
                // 设置密码编码器
                .passwordEncoder(passwordEncoder)
                // 注册用户admin，密码为abc，并赋予USER和ADMIN的角色权限
                .withUser("admin")
                // 可通过passwordEncoder.encode("abc")得到加密后的密码
                .password(passwordEncoder.encode("a123456"))
                // 赋予角色ROLE_USER和ROLE_ADMIN
                .roles("ADMIN");
    }

    /**
     * 配置HTTP安全设置，用于定义哪些URL需要安全访问。
     * @param http HttpSecurity的实例，用于配置HTTP安全设置。
     * @throws Exception 如果配置出错，抛出异常。
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 限定签名后的权限
        http.authorizeRequests()
                .antMatchers("/sbd/actuator/**", "/sbd/admin/**")
                .hasAnyRole("ADMIN")
                .anyRequest().permitAll()
                .and().anonymous()
                .and().formLogin();
    }
}
